"use strict"
/*
遍历Array可以采用下标循环，遍历Map和Set就无法使用下标。为了统一集合类型，ES6标准引入了新的iterable类型，Array、Map和Set都属于iterable类型。

具有iterable类型的集合可以通过新的for ... of循环来遍历。

for ... of循环是ES6引入的新的语法，请测试你的浏览器是否支持
*/

function testIterable() {
    var arr=[2,3,4];
    for (var i of arr){
        console.log(arr[i]);
    }
    console.log('你的浏览器支持for...of');
}

//用for ... of循环遍历集合
function loopTravelsal(){
    var arr=['a','b','c'];
    var m=new Map([[1, 'x'], [2, 'y'], [3, 'z']]);
    var s=new Set(['a','b','c']);
    //循环遍历数组
    for (var i of arr){
        console.log(i);
    }
    //循环遍历Map类型
    for (var x of m){
        console.log(x);
    }
    //循环遍历Set类型
    for (var i of s){
        console.log(i);
    }
}

//for...in与for...of区别
function Difference() {
    var arr=[1,2,3];
    arr.name="张小凡";
    //for...in循环将把新添加的name输出，但数组的length属性不包括在内
    for (var i in arr){
        console.log(i);//[1,2,3,name]
    }
    //for...of只输出原有的
    for (var i of arr){
        console.log(i);//[1,2,3]
    }
}

//使用iterable内置的forEach方法，它接收一个函数，每次迭代就自动回调该函数。以Array为例
function forEach() {
    var arr=['A','B','C'];
    arr.forEach(function (element,index,array) {
        //element:指向当前元素的值
        //index:指向当前索引
        //array:指向array对象本身
        console.log(element+',index='+index);
    })
}

//forEach循环Set和Map
function testForEach() {
    //Set与Array类似，但Set没有索引，因此回调函数的前两个参数都是元素本身
    var s=new Set(['A','B','C']);
    s.forEach(function (element,samElement,set) {
        console.log(element);
    });
    //Map的回调函数参数依次为value、key和map本身
    var m=new Map([['A',1],['B',2],['C',3]]);
    m.forEach(function (value, key, map) {
        console.log(value);
    });
}